Этот класс используется для того, чтобы получить структуру CRuntimeClass с именем класса. Эту структуру возвратят только объекты объявленные как:
DECLARE_DYNAMIC DECLARE_DYNCREATE
Описан этот макрос как:
RUNTIME_CLASS( имя класса ) //Имя класса фактическое не заключенное в кавычки
На место этого макроса компилятор поставит код. Вот такой:
#define RUNTIME_CLASS(class_name) \ ((CRuntimeClass*)(&class_name::class##class_name))
Модернизация прошлого примера с учетом RUNTIME_CLASS и тем, что он возвращает ссылку на CRuntimeClass.
void main()
{
CMyObject* myObj = new CMyObject;
CRuntimeClass* pClass = RUNTIME_CLASS(CMyObject);
if (myObj->IsKindOf(pClass))
cout << "CMyObject Class" << endl;
else
cout << "Not CMyObject Class" << endl;
}
Используя этот макрос объект можно создавать динамически не используя оператора new, вот пример. Можно рассматривать это как альтернативный метод создания объекта. Но только в том случае, если в объвлении класса используется макрос DECLARE_DYNCREATE.
#include "stdafx.h"
#include "afxwin.h"
#include "iostream.h"
class CMyObject : public CObject
{
protected:
DECLARE_DYNCREATE(CMyObject)
};
IMPLEMENT_DYNCREATE(CMyObject,CObject);
void main()
{
CRuntimeClass* pClass = RUNTIME_CLASS(CMyObject);
CObject* myObj = pClass->CreateObject();
ASSERT(myObj);
if (myObj->IsKindOf(pClass))
cout << "CMyObject Class" << endl;
else
cout << "Not CMyObject Class" << endl;
}
Вот вывод такой. Мы можем создать функцию, которая будет создавать любой объект в зависимости от параметров. Давайте сделаем для понимания.
#include "stdafx.h"
#include "afxwin.h"
#include "iostream.h"
class CMyObject : public CObject
{
protected:
DECLARE_DYNCREATE(CMyObject)
};
IMPLEMENT_DYNCREATE(CMyObject,CObject);
class CAlternativeObject : public CObject
{
protected:
DECLARE_DYNCREATE(CAlternativeObject)
};
IMPLEMENT_DYNCREATE(CAlternativeObject,CObject);
void CreateAllObject(CRuntimeClass* pClass);
void main()
{
CreateAllObject(RUNTIME_CLASS(CMyObject));
CreateAllObject(RUNTIME_CLASS(CAlternativeObject));
}
void CreateAllObject(CRuntimeClass* pClass)
{
CObject* myObj;
myObj= pClass->CreateObject();
ASSERT(myObj);
if (myObj->IsKindOf(RUNTIME_CLASS(CMyObject)))
cout << "CMyObject Class" << endl;
else
{
if (myObj->IsKindOf(RUNTIME_CLASS(CAlternativeObject)))
cout << "CAlternativeObject Class" << endl;
else
cout << "Not Info Class" << endl;
}
}